package com.xmcc.service.impl;

import com.google.common.base.Preconditions;
import com.xmcc.common.ResultJson;
import com.xmcc.dao.SysDeptMapper;
import com.xmcc.dao.SysUserMapper;
import com.xmcc.dto.SysDeptDto;
import com.xmcc.exception.ParamException;
import com.xmcc.pojo.SysDept;
import com.xmcc.pojo.SysUser;
import com.xmcc.service.SysDeptService;
import com.xmcc.utill.BeanValidator;
import com.xmcc.utill.LevelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class SysDeptServiceImpl implements SysDeptService {
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Autowired
    private SysUserMapper sysUserMapper;

    /**
     * 插入数据：
     * */
    @Override
    public void insert(SysDeptDto sysDeptDto) {
        //校验数据
        BeanValidator.check(sysDeptDto);
        //判断同一个父部门下部门名称不能重复
        if(checkDeptName(sysDeptDto.getName(),sysDeptDto.getParentId(),sysDeptDto.getId())){
            //需要转换为sysDept跟数据库对应  通过构建者模式 把dto的转移到pojo
            SysDept sysDept = SysDept.builder().name(sysDeptDto.getName())
                    .parentId(sysDeptDto.getParentId()).seq(sysDeptDto.getSeq())
                    .remark(sysDeptDto.getRemark()).build();
            //level
            //获得父类的level  父类的id为1  父类的lever  0    0-1
            sysDept.setLevel(LevelUtil.getLevel(getParentLevel(sysDeptDto.getParentId()),sysDeptDto.getParentId()));

            //操作人 TODO:得从session与request拿
            sysDept.setOperator("驱魔人");
            sysDept.setOperateTime(new Date());
            sysDept.setOperateIp("127.0.0.1");
            sysDeptMapper.insertSelective(sysDept);
        }else {
            //TODO:抛异常
        }
    }

    /**
     * 修改数据：
     * */
    @Override
    public void update(SysDeptDto sysDeptDto) {
        //看level是否改过  父部门的level+父部门的id生成
        //校验数据
        BeanValidator.check(sysDeptDto);
        //考虑能不能修改  部门名字不能重复
        if(checkDeptName(sysDeptDto.getName(),sysDeptDto.getParentId(),sysDeptDto.getId())) {
            //查询出修改之前之前的部门信息 获得level
            SysDept before = sysDeptMapper.selectByPrimaryKey(sysDeptDto.getId());
            //检验修改的部门是否存在
            Preconditions.checkNotNull(before, "修改的部门不存在");
            //需要转换为sysDept跟数据库对应  通过构建者模式 把dto的转移到pojo  修改的时候会多一个id
            SysDept after = SysDept.builder().id(sysDeptDto.getId()).name(sysDeptDto.getName())
                    .parentId(sysDeptDto.getParentId()).seq(sysDeptDto.getSeq())
                    .remark(sysDeptDto.getRemark()).build();
            //level
            //获得父类的level  父类的id为1  父类的lever  0    0-1
            if (sysDeptDto.getParentId().equals(LevelUtil.ROOT_LEVEL)){
                after.setLevel(LevelUtil.ROOT_LEVEL);
            }else {
                after.setLevel(LevelUtil.getLevel(getParentLevel(sysDeptDto.getParentId()),sysDeptDto.getParentId()));
            }
            //操作人 TODO:得从session与request拿
            after.setOperator("驱魔人");
            after.setOperateTime(new Date());
            after.setOperateIp("127.0.0.1");
            updateWithChild(before,after,sysDeptDto.getId());
        }else {
            //TODO:抛异常
        }
    }

    //判断部门是否为空，才能删除：
    @Override
    public ResultJson deleteDeptId(Integer deptId) {
        SysUser sysUser = sysUserMapper.selectByDeptId(deptId);
        if (sysUser==null){
            return ResultJson.success(sysDeptMapper.deleteByPrimaryKey(deptId));
        }else {
            return ResultJson.fail("该部门不为空，所有不能删除!!!");
        }
    }

    private void updateWithChild(SysDept before, SysDept after,Integer id) {
        //获得修改前的level
        String beforeLevel = before.getLevel();
        //获得修改后的level
        String afterLevel = after.getLevel();
        //判断两个level
        if(!beforeLevel.equals(afterLevel)){//会影响到子部门
            sysDeptMapper.updateChildLevel(beforeLevel,afterLevel,id);//修改子部门
        }
        sysDeptMapper.updateByPrimaryKey(after);
    }

    private String getParentLevel(Integer parentId){
        SysDept sysDept = sysDeptMapper.selectByPrimaryKey(parentId);// 0-1
        if(sysDept==null){
            return  null;
        }
        return sysDept.getLevel();

    }

    private boolean checkDeptName(String deptName,Integer parentId,Integer id){
        //Integer id为null说明在增加 id！=null说明在修改
        SysDept sysDept = sysDeptMapper.checkDeptName(deptName,parentId,id);
        if(sysDept != null){//已经有这个名字了 不能修改
            throw new ParamException("该部门名称已存在");
        }
        return true;
    }
}
